﻿using HappyTravellingService.DAO;
using HappyTravellingService.Entities;
using HappyTravellingService.Utils;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Script.Serialization;
using System.Web.Script.Services;
using System.Web.Services;

namespace HappyTravellingService
{
    /// <summary>
    /// Summary description for WebService1
    /// </summary>
    [WebService(Namespace = "http://183.91.7.215/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
    [System.Web.Script.Services.ScriptService]
    public class WebService1 : System.Web.Services.WebService
    {

        [WebMethod]
        [ScriptMethod(ResponseFormat=ResponseFormat.Json, UseHttpGet=true)]
        public User ForGenUserType()
        {
            User u = new User();
            u.Username = "mrloyal";
            u.DisplayName = "Thành Loyal";
            u.Password = "siduwkfmslk38874kskdf";
            return u;
        }


        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json, UseHttpGet = true)]
        public Meeting ForGenMeetingType()
        {
            Meeting m = new Meeting();
            User leader = new User();
            m.Leader = leader;
            return m;
        }

        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json, UseHttpGet = true)]
        public Invitation ForGenInvitationType()
        {
            Invitation ivt = new Invitation();
            ivt.Inviter = new User();
            ivt.Invitee = new User();

            return ivt;
        }



        /*
         * Tạo người dùng mới:
         * Tham số: 
         *    username
         *    password
         *    displayname
         * Trả về:
         *      -1: User đã tồn tại
         *      -2: Lỗi khác
         *      trả về id > 0 mới nếu thành công
         */

        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json, UseHttpGet = true)]
        public int CreateUser(string username, String password, string displayname)
        {
            DBHelper helper = DBHelperFactory.getDBHelperInstance();
            return helper.CreateUser(username, password, displayname);
        }




        /// <summary>
        /// Hàm login, kiểm tra sự tồn tại của user và password của user đó.
        /// </summary>
        /// <param name="username"></param>
        /// <param name="password"></param>
        /// <returns>
        ///     -1 : Failed
        ///     1  : Successed
        /// </returns>
        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json, UseHttpGet = true)]
        public int Login(string username, String password)
        {
            DBHelper helper = new DBHelper();
            return helper.Login(username, password);
        }

        /// <summary>
        /// Tạo một cuộc hẹn 
        /// </summary>
        /// <param name="leaderId">ID của user tạo cuộc hẹn này</param>
        /// <param name="content">Nội dung, tên hay mô tả của cuộc hẹn</param>
        /// <param name="time"></param>
        /// <param name="latitude"></param>
        /// <param name="longtitude"></param>
        /// <returns>
        ///     1 nếu thành công
        ///     -1 nếu lỗi gì đó
        ///     -2 nếu exception
        ///     19/12/2013: Sửa lại thành id của meeting vừa được tạo
        /// </returns>
        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json, UseHttpGet = true)]
        public int CreateMeeting(int leaderId, string content, DateTime time, double latitude, double longtitude)
        {
            DBHelper helper = new DBHelper();
            return helper.CreateMeeting(leaderId,  content, time, latitude, longtitude);
        }

        /// <summary>
        /// Thêm 1 người vào danh sách bạn của người dùng hiện tại
        /// </summary>
        /// <param name="sender">
        ///     Là người dùng hiện tại (người đã đăng nhập vào thiết bị)
        /// </param>
        /// <param name="targetUserId">
        ///     Là người mà người dùng hiện tại muốn kết bạn
        /// </param>
        /// <returns>
        ///     1: Thành công
        ///     Còn lại là thất bại
        /// </returns>
        [WebMethod]
        public int AddFriend(string sender, int targetUserId)
        {
            DBHelper helper = new DBHelper();
            return helper.AddFriend(sender, targetUserId);
        }



        /// <summary>
        /// Lấy danh sách tất cả bạn của 1 người dùng
        /// </summary>
        /// <param name="username">
        ///     Là người dùng mà ta muốn lấy danh sách bạn (người dùng đã đăg nhập ở thiết bị)
        /// </param>
        /// <returns>
        ///     Trả lại 1 Json string, mô tả 1 List<User>
        /// </returns>
        [WebMethod]
        public string GetAllFriends(string username)
        {
            DBHelper helper = new DBHelper();
            return helper.GetAllFriends(username);
        }



        /// <summary>
        /// Thay đổi các thông tin của 1 cuộc hẹn, 
        /// thực hiện update Meeting set .... WHERE Meeting.Id = meetingId
        /// </summary>
        /// <param name="meetingId">ID của Meeting cần sửa</param>
        /// <param name="content">Content mới</param>
        /// <param name="time">Thời gian mới</param>
        /// <param name="latitude"></param>
        /// <param name="longtitude"></param>
        /// <returns>1 nếu thành công, -1 cho thất bại</returns>
        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json, UseHttpGet = true)]
        public int EditMeeting(int meetingId, string content, DateTime time, double latitude, double longtitude)
        {
            DBHelper helper = new DBHelper();
            return helper.EditMeeting(meetingId, content, time, latitude, longtitude);
        }




        /// <summary>
        /// Lấy danh sách tất cả các cuộc hẹn của người dùng hiện tại, 
        /// cả cuộc gặp do người đó tạo, và cả cuộc gặp người đó sẽ tham gia
        /// </summary>
        /// <param name="userId">ID của người dùng đã login</param>
        /// <returns>Json string tương ứng với List<Meeting> của người dùng</returns>
        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json, UseHttpGet = true)]
        public string GetAllMyMeetings(int userId)
        {
            DBHelper helper = new DBHelper();
            return helper.GetAllMyMeetings(userId);
        }

        /// <summary>
        /// Lấy thông tin của 1 user dựa vào UserId của người đó
        /// </summary>
        /// <param name="userId"></param>
        /// <returns>
        ///     Trả về một string dạng JSON mô tả cho đối tượng user đó.
        /// </returns>
        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json, UseHttpGet = true)]
        public string GetUserById(int userId)
        {
            DBHelper helper = new DBHelper();
            User u = helper.GetUserById(userId);
            JavaScriptSerializer jss = JsonFactory.getJsonSerializer();
            return jss.Serialize(u);
        }


        /// <summary>
        /// Lấy thông tin về 1 cuộc hẹn dựa vào ID của cuộc hẹn đó.
        /// </summary>
        /// <param name="meetingId"></param>
        /// <returns>JSON string tương ứng với cuộc hẹn</returns>
        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json, UseHttpGet = true)]
        public string GetMeetingById(int meetingId)
        {
            DBHelper helper = new DBHelper();
            Meeting m = helper.GetMeetingById(meetingId);
            JavaScriptSerializer jss = JsonFactory.getJsonSerializer();
            return jss.Serialize(m);
        }



        /// <summary>
        /// Mời một số người tham gia vào 1 cuộc hẹn
        /// </summary>
        /// <param name="guests">
        ///     Kiểu mảng int[], là danh sách các ID của các bạn bè cần mời
        ///     truyền Các IDs thay vì truyền cả user, tiết kiệm lưu lượng cần truyền tải.
        /// </param>
        /// <param name="meetingId">ID của cuộc hẹn</param>
        /// <returns>1 nếu thành công, -1 nếu thất bại</returns>
        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json, UseHttpGet = true)]
        public int Invite(int inviterID, int[] guestIds, int meetingId)
        {
            DBHelper helper = new DBHelper();
            return helper.Invite(inviterID, guestIds, meetingId);
        }

        /// <summary>
        /// Lấy danh sách các lời mời của người dùng, được người khác mời
        /// </summary>
        /// <param name="userId">ID của người dùng hiện tại</param>
        /// <returns>JSON string tương ứng với các hoặc string "-1" nếu gặp lỗi</returns>
        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json, UseHttpGet = true)]
        public string GetMyInvitationRequest(int userId)
        {
            DBHelper helper = new DBHelper();
            return helper.GetMyInvitationRequest(userId);
        }




        /// <summary>
        /// Trả lời cho 1 lời mời tham gia cuộc gặp 
        /// </summary>
        /// <param name="userId">ID của người được mời, chính là người dùng hiện tại</param>
        /// <param name="meetingId"></param>
        /// <param name="answer">
        ///     đặt = 1 nếu đồng ý tham gia
        ///     đặt = 0 nếu từ chối
        /// </param>
        /// <returns> 1 nếu thành công, -1 nếu gặp lỗi</returns>
        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json, UseHttpGet = true)]
        public int ResponeToInvit(int userId, int meetingId, int answer)
        {
            DBHelper helper = new DBHelper();
            return helper.ResponeToInvit(userId, meetingId, answer);
        }


        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json, UseHttpGet = true)]
        public int UpdateLocation(int userId, double latitude, double longtitude)
        {
            DBHelper helper = new DBHelper();
            return helper.UpdateLocation(userId, latitude, longtitude);
        }



        /// <summary>
        /// Lấy danh sách người tham gia của 1 Meeting
        /// </summary>
        /// <param name="meetingId">Id của Meeting cần lấy</param>
        /// <returns>Một JSON string mô tả 1  List<User> </returns>
        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json, UseHttpGet = true)]
        public string GetMeetingUsers(int meetingId)
        {
            DBHelper helper = new DBHelper();
            List<User> us = helper.GetMeetingUsers(meetingId);
            return JsonFactory.getJsonSerializer().Serialize(us);
        }
    }




























    public class Temp {
        public Temp(int id, string name)
        {
            this.id = id;
            this.Name = name;
        }

        public Temp()
        {
            this.id = 0;
            this.Name = "No name";
        }
        public int id { get; set; }
        public string Name { get; set; }
    }
}
